package w83a.w83aOperacionesPaso.w83aLotesPreavisos;

import java.io.StringWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import n38a.exe.N38APISesion;

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.w3c.dom.Document;

import w83a.iLote4.stubs.W83aNSHFFacadeWS;
import w83a.objects.W83aThirdPartySessionObject;
import w83a.w83aBeans.W83aCertificadoBean;
import w83a.w83aBeans.W83aUsuarioXLNetsBean;
import w83a.w83aUtilidadesComunes.W83AUtilXml;
import w83a.w83aUtilidadesComunes.W83aClsConstantes;
import w83a.w83aUtilidadesComunes.W83aClsTrazas;
import es.ejie.frmk.listeners.base.Q70ListenerUtils;
import es.ejie.frmk.presentacion.operacion.paso.Q70ActionPasoOP;
import es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE;



public class W83aValidarFirmaAjaxActionOP extends Q70ActionPasoOP {

	protected void processOP(Q70ContextoEJIE contexto, ActionErrors errores, ActionMapping mapping,
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		//Guardamos la accion en el contexto
	}
	
	
	protected ActionForward processForward(Q70ContextoEJIE contextoEJIE, ActionErrors errors, ActionMapping mapping, 
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		//1-LLamar a verifyAdESSignature del NSHF, pasándole el EJGVDOCUMENT firmado
		String firma= request.getParameter("firma");
		String documentB64= request.getParameter("documentB64");
		W83aNSHFFacadeWS NSHFFacade = new W83aNSHFFacadeWS();
		
		//Token de aplicación
	    N38APISesion miAPISesion = new N38APISesion();
	    Document miSesion;
	    miSesion=miAPISesion.n38APISesionCrearApp(Q70ListenerUtils.getApplicationProperty("COD_APLICACION"));
	    String token = DOM2String(miSesion);
		
	    
		//Datos usuario acceso aplicación
	    W83aUsuarioXLNetsBean usuarioXLNetsBean = (W83aUsuarioXLNetsBean)contextoEJIE.get(W83aClsConstantes.CONSTANTE_CONTEXTO_USUARIO);
		W83aThirdPartySessionObject thirdPartyObj = new W83aThirdPartySessionObject();
		thirdPartyObj.parse(usuarioXLNetsBean.getXmlThirdPartySession());
		W83aClsTrazas.trazaDebug(null, "El que ha entrado: "+thirdPartyObj.getIdDocumento());
	    
		StringBuffer firmanteActual=new StringBuffer();
		StringBuffer firmanteSupuesto=new StringBuffer();
		firmanteSupuesto.append(StringUtils.trimToEmpty(thirdPartyObj.getNombre())).append(" (").append(StringUtils.trimToEmpty(thirdPartyObj.getIdDocumento())).append(")");
		
	    //Comprobamos si la firma lleva ya el dni
	    String strDNI=W83AUtilXml.fncParsearXml(firma, "dni");
		String strNombre=W83AUtilXml.fncParsearXml(firma, "nombre");
		String strApellido1=W83AUtilXml.fncParsearXml(firma, "apellido1");
		String strApellido2=W83AUtilXml.fncParsearXml(firma, "apellido2");
	    
		//if(strDNI.equals("NOEXISTE")){
		    
		    //Llamada al WS para validar firma
		    W83aCertificadoBean resultado =NSHFFacade.verifyAdESSignature(token, firma, documentB64);
			
			
			W83aClsTrazas.trazaDebug(null, "Firma validada: "+resultado.isValido());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado nombre: "+resultado.getNombre());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado documento: "+resultado.getDocumento());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado Causa: "+resultado.getCausa());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado CertificateSerialNumber: "+resultado.getCertificateSerialNumber());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado Politica: "+resultado.getPolitica());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado SignatureDate: "+resultado.getSignatureDate());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado CertificateIssuer: "+resultado.getCertificateIssuer());
			W83aClsTrazas.trazaDebug(null, "El que ha firmado CertificateSubject: "+resultado.getCertificateSubject());
			
			if (resultado.isValido()){
			
				boolean coincide = resultado!=null && resultado.getDocumento()!=null && thirdPartyObj.getIdDocumento().trim().equals(resultado.getDocumento().trim());
				
				
				//Devolver el resultado en forma de JSON

				firmanteActual.append(StringUtils.trimToEmpty(resultado.getNombre())).append(" (").append(StringUtils.trimToEmpty(resultado.getDocumento())).append(")");
				
				response.setContentType("text/xml; charset=ISO-8859-1");
				response.setHeader("Cache-Control", "no-cache");
				StringBuffer strbfResponseAJAX = new StringBuffer("");
				strbfResponseAJAX.append("[AJAX_JSON]{");
				strbfResponseAJAX.append("\"coincide\":\"").append(coincide).append("\",");
				strbfResponseAJAX.append("\"firmanteActual\":\"").append(firmanteActual).append("\",");
				strbfResponseAJAX.append("\"firmanteSupuesto\":\"").append(firmanteSupuesto).append("\"");
				strbfResponseAJAX.append("}[AJAX_JSON]");
				response.getWriter().write(strbfResponseAJAX.toString());
			}
	/*    }else{
	    	//La firma lleva ya el dni de la persona que ha firmado
	    	W83aClsTrazas.trazaDebug(null, "El que ha firmado documento: "+strDNI);
	    	W83aClsTrazas.trazaDebug(null, "El que ha firmado nombre: "+strNombre);
	    	W83aClsTrazas.trazaDebug(null, "El que ha firmado apellido1: "+strApellido1);
	    	W83aClsTrazas.trazaDebug(null, "El que ha firmado apellido2: "+strApellido2);
	    	
			boolean coincide = thirdPartyObj.getIdDocumento().trim().equals(strDNI.trim());
			

			//Devolver el resultado en forma de JSON
			firmanteActual.append(StringUtils.trimToEmpty(strNombre)).append(" ").append(StringUtils.trimToEmpty(strApellido1)).append(" ").append(StringUtils.trimToEmpty(strApellido2)).append(" (").append(StringUtils.trimToEmpty(strDNI)).append(")");
			
			response.setContentType("text/xml; charset=ISO-8859-1");
			response.setHeader("Cache-Control", "no-cache");
			StringBuffer strbfResponseAJAX = new StringBuffer("");
			strbfResponseAJAX.append("[AJAX_JSON]{");
			strbfResponseAJAX.append("\"coincide\":\"").append(coincide).append("\",");
			strbfResponseAJAX.append("\"firmanteActual\":\"").append(firmanteActual).append("\",");
			strbfResponseAJAX.append("\"firmanteSupuesto\":\"").append(firmanteSupuesto).append("\"");
			strbfResponseAJAX.append("}[AJAX_JSON]");
			response.getWriter().write(strbfResponseAJAX.toString());
	    	
	    }*/
		return null;
	}


	

	
	
	public static String DOM2String(Document doc){
		TransformerFactory transformerFactory =TransformerFactory.newInstance();
		Transformer transformer = null;
		try{
			transformer = transformerFactory.newTransformer();
		}catch (javax.xml.transform.TransformerConfigurationException error){
			//int coderror=123;
			//String msgerror=error.getMessage();
			return null;
		}
		 
		Source source = new DOMSource(doc);
		 
		StringWriter writer = new StringWriter();
		Result result = new StreamResult(writer);
		try{
			transformer.transform(source,result);
		}catch (javax.xml.transform.TransformerException error){
			return null;
		}
		 
		String s = writer.toString();
		return s;//NOPMD
	}

}
